package com.shishuo.cdn.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * 字符串工具类，提供常见的字符串操作
 * @author 朱晓川
 * 2012-09-11
 */
public class StringUtil { 
	
	/**邮箱格式*/
	public static final String REGEX_EMAIL = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
	
	/**手机号码正则表达式*/
	public static final String REGEX_CELLPHONE = "^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$" ;
	
	/**账户格式:由6-18位英文字母、数字、'_'、'-'组成，必须以英文字母开头，区分大小写。*/
	public static final String REGEX_ACCOUT = "^[a-zA-Z]{1}[a-zA-Z0-9_-]{5,17}$";
	
	/**升学卡正则：12位数字*/
	public static final String REGEX_SXW_CARD_NO = "^\\d{12}$" ;
	
	/**匹配除img标签之外的所有html标签*/
//	public static final String REGEX_HTML_NOT_IMG = "<(?!img)[^>]*>";
	public static final String REGEX_HTML_NOT_IMG = "<(?!\\/?sup|\\/?img|\\/?div|\\/?sub|\\/?u|\\/?p|\\/?table|\\/?tr|\\/?td|\\/?tbody)[^>]*>";
	
	/**匹配除img标签之外的所有html标签*/
	public static final String UPDATE_HTML_IMG = "<(img){1}[^>]*>";
	/**匹配img标签的src属性值*/
	public static final String REGEX_IMG_SRC = "<([iI][mM][gG]){1}.+?src=['\"](.+?)['\"]"; 
	
	/**匹配html标签的正则表达式*/
	public static final String REGEX_HTML = "<(.+?)[^>]*>"; 
	
	/**匹配a标签左右两边的正则表达式*/
	public static final String REGEX_A = "</?(A|a)(\n|.)*?>";//或者  </?(A|a)[^>]*>  
	
	/**匹配html右标签标签的正则表达式*/
	public static final String REGEX_HTML_RIGHT = "<\\/[^>]*>"; 
	
	/**匹配html左标签标签的正则表达式*/
	public static final String REGEX_HTML_LEFT = "<[^\\/][^>]*>"; 
	
	/**匹配p标签的正则表达式('/'出现0次或1次后跟1个p，后跟任意非右尖括号的字符，最后跟一个右尖括号)*/
	public static final String REGEX_P = "<(\\/?[pP])[^>]*>"; 
	
	/**匹配img标签的alt属性值*/
	public static final String REGEX_IMG_ALT = "<([iI][mM][gG]){1}.+?alt=['\"](.+?)['\"]";
	/**匹配img标签的alt属性值*/
	public static final String REGEX_STYLE = "<([pP]){1}.+?style=['\"](.+?)['\"]";
	/**匹配数字的数字正则表达式*/
	public static final String REGEX_NUMBER = "\\d+"; 
	
	/**匹配由数字和逗号组成的字符串*/
	public static final String REGEX_NUMBER_COMMA = "(\\d+,?)+"; 
	/**匹配6位数字区域代码的正则表达式*/
	public static final String REGEX_AREA_CODE = "\\d{6}" ;
	
	/**匹配用户姓名的正则表达式：2-7个中文字符或者3-20个英文字母*/
	public static final String REGEX_USER_NAME = "(([\u4E00-\u9FA5]{2,7})|([a-zA-Z]{3,20}))" ;
	
	/**匹配一到多个汉字正则表达式*/
	public static final String REGEX_CHINESE = "[\u4E00-\u9FA5]+" ; 
	
	/**获取img标签src属性值的正则表达式组编号，参看表达式：REGEX_IMG_SRC*/
	public static final int IMG_GROUP_POSITION = 2 ;
	
	/** 空字符串 */
	public static final String STRING_EMPTY = "";
	/**等号*/
	public static final String STRING_EQUAL = "=";
	/**单与号*/
	public static final String STRING_SINGLE_AND = "&";
	/**问号*/
	public static final String STRING_QUESTION_MARK = "?";

	/** 逗号分割符 */
	public static final String SPLIT_SYMBOL_COMMA = ",";

	/** 左斜线分割符 */
	public static final String SPLIT_SYMBOL_SLASH = "/";
	
	/**windows文件夹分隔符*/
	public static final String FILE_SEPARATOR_WINDOWS = "\\";
	
	/** true的字符串值 */
	public static final String STRING_TRUE = "true";
	
	/** false的字符串值 */
	public static final String STRING_FALSE = "false";
	
	//防止直接实例化
	private StringUtil(){} ;
	
	/**判断一个字符串是否为空，null以及空字符串视为空*/
	public static boolean isEmpty(String str){
		//判断长度比执行equals方法比较空字符串的效率要高
		return str == null || str.length() <= 0 ;
	}
	
	/**判断一个字符串是否为空白字符串*/
	public static boolean isBlank(String str){
		return str != null && str.trim().length() <= 0 ;
	}
	
	/**为空或者空白*/
	public static boolean isEmptyOrBlank(String str){
		return str == null || str.trim().length() <= 0 ;
	}
	
	/**去掉字符串中的html标签*/
	public static String removeHtmlTag(String input){
		if(isEmpty(input)){
			return input ;
		}
		return input.replaceAll(REGEX_HTML,STRING_EMPTY) ; 
	}
	
	/**去掉字符串中的p标签*/
	public static String removeTagP(String input){
		if(isEmpty(input)){
			return input ;
		}
		return input.replaceAll(REGEX_P,STRING_EMPTY) ; 
	}
	
	/**判断字符串是否由数字组成*/
	public static boolean isNumber(String str){
		boolean flag = false ;
		if(!isEmpty(str)){
			if(str.matches(REGEX_NUMBER)){
				flag = true ;
			}
		}
		return flag ; 
	}
	
	/**
	 * 抽取出字符串中的所有数字,如果没有数字字符，则返回空字符串
	 */
	public static String drawNumber(String source){ 
		return drawMatches(source,REGEX_NUMBER) ;
	}
	
	/**
	 * 从字符串中取出满足正则表达式条件的字符串
	 */
	public static String drawMatches(String source,String regex){
		Matcher matcher = getMatcher(source,regex) ;
		StringBuffer buff = new StringBuffer() ;
		while(matcher.find()){
			buff.append((matcher.group()));
		}
		return buff.toString() ;
	}
	
	/**返回字符串source匹配正则表达式regex的matcher实例(regex对大小写敏感)*/
	public static Matcher getMatcher(String source,String regex){
		Pattern pattern = Pattern.compile(regex) ; 
		return pattern.matcher(source) ;
	}
	
	/**
	 * 字符串左补0操作，如果不足bitCount位，则在左边补0
	 * @param num  要操作的数字
	 * @param bitCount  欲返回多少位的字符串
	 * @return
	 */
	public static String Lpad(int num,int bitCount){
		String elem = String.valueOf(num) ;
		char[] elemArr = elem.toCharArray() ;
		int length = elemArr.length ;
		
		if(bitCount <= length){
			return elem ;
		}else{
			int zeroCnt = bitCount - length ;
			StringBuffer zeroBuff = new StringBuffer() ;
			for(int i = 0 ; i < zeroCnt ;i++){
				zeroBuff.append("0") ;
			}
			return zeroBuff.append(elem).toString() ; 
		}
	}
	
	/**
	 * 获取生成卡的初始密码，由字母和数字间隔组成，去除易混淆字符
	 */
	public static String getDefaultCardPswd(int length) {
		char[] charArray = new char[length];
		for (int i = 0; i < length; i++) {
			charArray[i] = getNotObscureRandChar(i%2==1);
		}
		return String.valueOf(charArray);
	}
	
	/**
	 * 返回不混淆的容易识别的小写字母及数字
	 * @param isNumber 要数字还是要字母
	 * @return random char which not obscure; 
	 */
	public static char getNotObscureRandChar(boolean isNumber){
		Random r = new Random();
		
		/**
		 * 括弧内的字符不要，容易混淆
		 * (019)2345678abcdefgh(i)jk(l)mn(o)p(q)r(s)t(uv)wxy(z)
		 */
		String notObscureChars="2345678abcdefghjkmnprtwxy";
		int i = r.nextInt(notObscureChars.length());
		for(;;i=r.nextInt(notObscureChars.length())){
			@SuppressWarnings("unused")
			boolean isNotObscureChar=false;
			
			if(isNumber){
				if(i<7)break;else continue;
			}else{
				if(i>6)break;else continue;
			}
		};
		return  notObscureChars.charAt(i);
	}
	
	public static String getStrings(int length) {
		char[] charArray = new char[length];
		for (int i = 0; i < length; i++) {
			Random r = new Random();
			int n = r.nextInt(123);
			while (n < 48 || (n > 57 && n < 65) || (n > 90 && n < 97)
					|| n > 122) {// (!((n>=48 && n<=57) || (n>=65 && n<=90) &&
				// (n>=97 && n<=122))){
				n = r.nextInt(123);
			}
			charArray[i] = (char) n;
		}
		return String.valueOf(charArray);
	}
	
	/**得到字符串中第一串连续的整型数字*/
	public static int getFirstInt(String str) {  
	    int i = 0;  
	    try {  
	        Pattern p = Pattern.compile("^\\d+");  
	        Matcher m = p.matcher(str);  
	        if (m.find()) {  
	            i = Integer.valueOf(m.group());  
	        }  
	    } catch (NumberFormatException e) {  
	        e.printStackTrace();  
	    }  
	    return i;  
	}  
	
	/**验证邮箱是否合法*/
	public static boolean validateRegEmail(String email){
		boolean flag = true ;
		
		//邮箱
		if(StringUtils.isEmpty(email)){
			flag = false ;
		}else if(!email.matches(REGEX_EMAIL)){
			flag = false ;
		}
		return flag ;
	}
	
	/**验证手机号是否合法*/
	public static boolean validateRegTel(String telephone){
		boolean flag = true ;
		
		//手机号码
		if(StringUtils.isEmpty(telephone)){
			flag = false ;
			return flag ;
		}else if(!telephone.matches(REGEX_CELLPHONE)){ 
			flag = false ;
			return flag ;
		}
		return flag ;
	}
	
	/**验证升学卡号是否合法*/
	public static boolean validateCardNo(String cardNo){
		boolean flag = true ;
		
		//手机号码
		if(StringUtils.isEmpty(cardNo)){
			flag = false ;
			return flag ;
		}else if(!cardNo.matches(REGEX_SXW_CARD_NO)){ 
			flag = false ;
			return flag ;
		}
		return flag ;
	}
	
	/**去掉字符串中的a标签，保留超链接中的文字*/
	public static String removeATag(String input){
		if(isEmpty(input)){
			return input ;
		}
		return input.replaceAll(REGEX_A,STRING_EMPTY) ; 
	}
	/**   
	* 描述：   订单号生成
	* 创建人：YangJ  邮箱:yangjie@sxw100.com   
	* 创建时间：2015年6月30日 上午11:56:27   
	* 修改备注：   
	* @version    
	*    
	*/ 
	public static String CreateOrderSn(){
		String random=String.valueOf(Math.random());
		String time=new SimpleDateFormat("YMMdd_HHmmss_").format(new Date());
	return (time+random.subSequence(random.length()-6, random.length()));
	}
//	public static void main(String[] args) {
//		System.out.println(CreateOrderSn());
//	}
}
